iT邦幫忙

2022 iThome 鐵人賽

DAY 1
0

開宗明義,先說本系統文章的寫作風格:盡量條列,並附上圖解及程式碼。開講:

  • Object-Oriented這個術語,台灣的中譯『物件導向』相信大家都耳熟能詳,大陸方面則作『面向對象』,此譯名我們可能很不習慣,但是不一定較差。
  • 因中英文都長,下文簡稱OO或OOP。
  • OO和OOP的關係:
    • OO是大範圍,包括OO分析、OO設計如著名的UML、OO資料庫(1990年代台灣就有推出,但最後無疾而終),...等。
    • OOP是「OO大家族」的成員,專注於coding或programming層面。
    • 本文以下講的OO,其實都是OOP。
  • OO/OOP是一個程式設計領域的paradigm。
  • 所謂paradigm,是屬於「戰略」層面的高階程式思維模式或coding方式。以「功夫」作比喻,paradigm練的是「內力」甚至是功夫哲理,而不是「泰山壓頂」、「雙龍探珠」等一招一式。
  • 各種programming paradigms簡圖(並未窮盡):
  • 程式語言(PL)和paradigm之間的關係,不是一對一或一對多,而是「多對多」,亦即同一種paradigm之下有多個PL's,這是理所當然;另一方面,一個PL也可以歸屬一種以上的paradigms。例如上圖的C++,就同時具有Imperative和OO性質;Python更是悠遊於Imperative, OO和Functional之間,自得其樂。

OO優點

  • 如上圖所示,程式設計的paradigms有很多,在OO之前流行的是Procedural,目前的主流是OO。本系列也只關注OO。
  • OO的優點:
    • 比起之前的Procedural,OO可以更直觀地描繪出真實世界的運作。
    • 以筆者經驗,以前用Procedural的程式語言設計系統,當程式越來越複雜,到10幾萬行時,大部分時間都在追踪之前的code,debug越來越困難、生產力越來越低。OO的目的,就是要解決這些中大型程式在「易讀」、「方便維護」和「方便擴充(彈性)」等等問題。
  • OO的好處多半不是在開發階段立刻享受得到。但別忘了80/20法則,80%的efforts是在維護期間出現的,這時候OO的優點就派上用場了。其實筆者以前開發的程式,根本不是80/20,而是98/2,98%時間精力都花在第1版之後的擴充和debug時期。
  • 再說明一下:不管哪一種paradigm,只要是「圖靈完備語言(Turing-Complete Language)」,就可以完成任何講得出邏輯的事情。差別在於完成事情的思維模式、方法和途徑有所不同。目前一般認為在中大型系統上使用OO會比使用Procedural更佳。
  • 舉例而言,要在程式產生一個「人」,設定他的身高、體重,然後計算BMI,如果用C語言寫,可能比較不直觀。但在OO中則可以非常自然地描述上述問題。
    • 計算BMI: Procedural版(以C為例):
      #include <stdio.h>
      
      double GetBmi(double, double);
      
      int main()
      {
        char name[50] = "Alex Van";            // 姓名
        double height = 169;                   // 身高
        double weight = 67.5;                  // 體重
        double bmi = GetBmi(weight, height);   // 呼叫計算BMI函數
        printf("name: %s\t\tBMI: %.2lf\n", name, bmi);
        return 0;
      }
      
      double GetBmi(double weight, double height)
      {
        height = height / 100;
        return weight / (height*height);
      }
      
    • 計算BMI: OO版-1(以Python為例)
      class Person:
          def __init__(self, name: str, height: int, weight: float):
              self.name: str = name
              self.height: int = height
              self.weight: float = weight
      
          def get_bmi(self) -> float:
              return self.weight / ((self.height / 100) ** 2)
      
      
      me = Person(name="Alex Van", weight=67.5, height=169)
      bmi = me.get_bmi()
      print(f"name: {me.name}\t\tBMI: {round(bmi, 2)}")
      
    • 計算BMI: OO版-2(OO版-1的進化):
      class Person:
          def __init__(self, name: str, height: int, weight: float):
              self.name: str = name
              self.height: int = height
              self.weight: float = weight
              self.bmi: float = self.weight / ((self.height / 100) ** 2)
      
      
      me = Person(name="Alex Van", weight=67.5, height=169)
      print(f"name: {me.name}\t\tBMI: {round(me.bmi, 2)}")
      
  • OO版(尤其是OO版-2)非常直觀,不需任何註解,就看出這個人叫me、身高169、體重67.5,BMI經計算後是23.63。重點是身高、體重和BMI都「收納」在me之下。

下一篇
類別是「模板」或「藍圖」
系列文
Oops! OOPP: An Introduction to Object-Oriented Programming in Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言